Android新的动画库-SpringAnimation(弹簧动画)
版权声明:
本公众号发布的所有文章,均属于原创,版权归本公众号所有。
允许有条件转载,转载请附带底部二维码。
一、前言
前几天,Android 在 Support Library(25.3.0)中,新增和修复了一些 API,其中新增了一个基于物理学的动画支持库,被命名为:SpringAnimation(弹簧动画)。
紧跟着,Google Android 研发工程师 『Nick Butcher』 在 Twitter 上发布推文予以公布,并且在 gist 中给出了一个简单的实例代码,演示了 SpringAnimation 的核心效果。
实际上,在 gist 中给出的示例是不完整的。而且既然有新东西,当然要第一时间体验一下。并且它既然是 Support 包下的,是没有 API Level 限制的。
二、SpringAnimation
SpringAnimation 弹簧动画,顾名思义它可以实现一种类似弹簧弹动效果的动画,设计的非常巧妙。
生活的尝试告诉我们,弹簧在拉伸或者压缩后,一旦被释放,会自动恢复到原来的模样,但是在恢复的时候过程中,不是一步到位的恢复,而是有一个弹动的效果。而SpringAnimation 就是模拟的这种弹簧效果的动画。它可以在 View 移动后,模拟弹簧的效果恢复到原本的位置上。
SpringAnimation 实际上是实现了 DynamicAnimation 。DynamicAnimation 同样也是 Support Library (25.3.0) 中新增的类,所以等于真的是新增了一整套新的 Animation 形式。
1、gist上的Demo
既然『Nick Butcher』已经发布了一个Demo,那么我们就直接还原这个Demo,使用这个Demo来分析。
不过它只是 Demo ,真的非常的简单。主要的逻辑就在View的onTouch里实现的,为了方便阅读,就不贴完整的代码了。
Demo 中,根据Touch 事件移动的方向,分别做了两个 SpringAnimation,然后分别执行,最终就作用在 View 上,就有上面 gif 图的效果。
可以看到,实际上,它通过设置两个属性,来确定这个弹簧动画的效果,分别是:Stiffness 和 DampingRatio。这个下面会讲解它的意思。
2、SpringAnimation API
再看看SpringAnimation 的 构造方法。
可以看到,它提供了两个构造方法,再来分别说说它们的参数。
View:动画作用的 View,没什么好说的。
ViewProperty :弹簧动画操作的弹动坐标轴,从源码中可以看到,可以传递 TRANSLATION_X、TRANSLATION_Y、TRANSLATION_Z ,它们分别表示了X、Y、Z 轴。
finalPosition:动画执行最终恢复的点,注意这个点是在原位置的偏移量,所以要恢复到最初的位置,之需要设置为 0 即可。
虽然它提供了两个构造方法,但是实际上,即便是使用两个参数的构造方法,我们也需要自行设置 SpringForce 对象,否者在调用 start() 的时候也会报错,所以一般我们直接使用三个参数的构造方法就好了,提前指定动画结束后恢复的点。
在 start() 的时候,会先调用 sanityCheck() 方法进行检查mSpring 对象是否被初始化,如果没有被初始化,就直接抛异常出来。
而从上面的例子可以看到,弹动动画实际上是对 SpringAnimation 配置的两个属性 :stiffness (劲度程度)、dampingRatio(阻尼程度),这两个属性都是属于 SpringForce 对象的。
通过生活中,我们对弹簧的认识,应该知道,这两个属性就是影响弹簧拉伸效果和恢复效果的两个重要的因素。不同的弹簧,承受不同的弹力,对应不同的阻尼效果,有了这两个属性就可以唯一确定这个弹簧的弹动效果。SpringAnimation 将弹簧的弹动效果,通过这两个属性完美的诠释。
在一些极端情况下,例如无阻尼效果的时候,动画一旦开始,就不会再结束了,一直周而复始的弹动下去。
3、需要注意的
还记得 Animation 和 Animator 的区别吧。Animation 实际上改变的是 View 的『视觉位置』,而Animator 是真的从 View 的属性上改变了 View 的『物理位置』。
而SpringAnimation 既然被命名为一个 Animation,那么它实际上也只是改变了『视觉位置』,所以在做一些点击时间的时候,如果 finalPosition 不是被设置为 0 的话,要注意它实际还是在 “0” 的位置上。
这一点可以在开发者选项中,打开 『显示布局边界』来确定。
三、结语
Android 提供了新的 SpringAnimation,如果想要尝试的,记得在 build.gradle 文件中,添加对应的依赖库。
compile 'com.android.support:support-dynamic-animation:25.3.0'
SpringAnimation 使用起来非常的便利,可以帮开发者解决一些设计们需要的弹簧弹动的效果。但是具体使用场景,可以发挥自己的想象。
老规矩,完整的 Demo ,在公众号回复 『SpringAnimation』 获得。